<?php

namespace Addons\Login;

use Common\Controller\Addon;
use Think\Verify;

/**
 * 登录插件 原始系统只给予简单的账号密码验证
 * 考虑安全性 给予开发者一个更加自由的扩展接口
 * 可用于添加登录验证，如验证码 第三方登录等
 * Class LoginAddon
 * @package Addons\Login
 */
class LoginAddon extends Addon
{
    public static $conf_name = 'login_addon_config';
    public static $default_conf = array(
        'verify_open'=>1,
        'verify'=>array (
            'expire' => '120',
            'font_size' => '16',
            'length' => '4',
            'imageW' => '0',
            'imageH' => '0',
            'seKey' => 'icy8',
        ),
        'third_open'=>1
    );
    /**
     * 注册钩子
     * 初步设想：
     * 返回钩子数组 用于告诉系统这个插件想要完成什么功能 要对哪些钩子进行实现
     * 数组结构：
     * ['系统钩子'=>'钩子的别名方法']
     * 或 ['系统钩子'=>['一些列的功能队列','一些列的功能队列','一些列的功能队列']] 这种写法多用于队列类型的功能
     * 或['系统钩子1','系统钩子2','系统钩子3',] 这种写法是最简便的，但执行的方法就只能是和系统钩子名称相同的本类的方法名了
     * 当然一个插件中允许你使用任意的钩子注册规则进行混合使用
     * @return array|void 必须返回
     */
    public function register_hook()
    {
        // 目前接入验证码、第三方登录等
        return [
            'login_input_end' => 'verify_code',// 登陆验证码
            'login_form_end' => 'third_login', // 第三方登录
            'login_start'
        ];
    }

    // 钩子逻辑实现

    /**
     * 验证码显示
     * @param $param
     */
    public function verify_code(&$param)
    {
        $this->display('verify_code');
    }

    /**
     * 第三方登录显示
     * @param $param
     */
    public function third_login(&$param) {
        $this->display('third_login');
    }

    /**
     * 登录验证开始
     * 对验证进行拦截 如果验证失败则终止系统运行 否则继续
     * @param $post
     */
    public function login_start($post) {
        $v = new Verify(self::get_conf(self::$conf_name)['verify']);
        $res = $v->check($post['verify_code']);
        if(!$res) {
            $this->error('验证码错误');
        }
    }
    // 钩子逻辑结束

    /**
     * 插件开关
     * @return bool 必须告诉系统 插件的开关结果
     */
    public function start()
    {
        return true;
    }

    /**
     * 插件安装
     * @return bool 必须告诉系统 插件的开关结果
     */
    public function install()
    {
        $model = D('Config');
        $data = $model->create(array(
            'type'=>'text',
            'group'=>1,
            'name'=>self::$conf_name,
            'value'=>serialize(self::$default_conf),
        ));
        if(!$data) return false;
        $res = $model->add();
        if(!$res) return false;
        return true;
    }

    /**
     * 插件卸载
     * @return bool 必须告诉系统 插件的开关结果
     */
    public function uninstall()
    {
        $map = array(
            'name'=>self::$conf_name,
        );
        D('Config')->where($map)->delete();
        return true;
    }
}